﻿/**
* ...
* @author Firsoff Maxim, icq:235859730, email:firsoff_maxim@mail.ru, tel:+79222345364
* @version 0.1 / 19.12.2007 10:34
*/

package ru.vega_int.firsoff.as3
{
	import flash.display.Sprite;
	import flash.events.*;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.net.URLLoaderDataFormat;
	import ru.vega_int.firsoff.as3.events.XMLLoaderEvent;
	
	public class XMLLoader extends Sprite
	{
		//	PROPERTIES
		public var useGarbage:Boolean = false;
		// private
		
		private var request:URLRequest;
		private var loader:URLLoader;
		private var initObject:Object;
		private var _url:String;
		private var _data:XML;
		private var _type:String;
		private var _typeError:String;
		//	public
		
		//	CONSTRUCTOR
		/**
		 * @param	_url		Файл
		 * @param	initObject	Инициализирующий объект, служебная штука
		 */
		function XMLLoader(_url:String, initObject:Object=null)
		{
			this.initObject = initObject;
			if(initObject){_type = initObject.type;};
			loadXML(_url);
		};
		
		//	METHODS
		
		// private
		/**
		 * Загрузка 1 файла XML
		 *
		 * @param	url			Ссылка на файл
		 * @param	section		Тип файла
		 */
		private function loadXML(url:String):void
		{
			this._url = url;
			loader = new URLLoader();								// экземпляр лоадера
			loader.dataFormat = URLLoaderDataFormat.TEXT;
			request = new URLRequest(url);
			loader.dataFormat = URLLoaderDataFormat.TEXT;			// будет загружаться текстовый формат
			loader.addEventListener(Event.COMPLETE, handleComplete);// добавляем слушателя
			loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, handleError);
            loader.addEventListener(IOErrorEvent.IO_ERROR, handleError);
			loader.load(request);									// непосредственно загрузка
		};
		
		private function rand():String
		{
			return String('?garbage=' + Math.random() * 1000);
		};
		
		/**
		 * Обработчик вызывается при удачной загрузке XML файла
		 *
		 * @param	e	событие
		 */
		private function handleComplete(event:Event):void
		{
			var eventObject:Object = new Object();
			//trace(event.target.data)
			try
			{
				this._data = new XML(event.target.data);
				//this._data.ignoreWhitespace = true;
				eventObject = this.initObject;
				this.dispatchEvent(new XMLLoaderEvent(XMLLoaderEvent.ON_LOAD, eventObject));
			}
			catch(e:TypeError)
			{
				
				this._typeError = e.message;
				eventObject = this.initObject;
				eventObject.url = _url;
				this._data = event.target.data;
				this.dispatchEvent(new XMLLoaderEvent(XMLLoaderEvent.ON_ERROR, eventObject));
			};
		};
		
		
		/**
		 * Обработчик ошибки
		 *
		 * @param	e
		 */
		private function handleError(e:Event):void
		{
			//trace(e.type)
			var eventObject:Object =  {url:request.url, initObject:this.initObject, typeError: 'IO_ERROR'};
			this.dispatchEvent(new XMLLoaderEvent(XMLLoaderEvent.ON_ERROR, eventObject));
		};
		
		// public
		public function get data():XML{return this._data};
		public function get url():String{return this._url};
		public function get type():String{return this._type};
		public function get typeError():String{return this._typeError};
		public function close():void
		{
			loader.close();
		};
	};
};